<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>CREATE SCHEMA</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-createrule.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-createrule.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-createsequence.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-createsequence.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-CREATESCHEMA"></a>CREATE SCHEMA</h1>
<div class="REFNAMEDIV"><a name="AEN48459"></a><h2>名称</h2>CREATE SCHEMA&nbsp;--&nbsp;定义一个新模式</div>
<a name="AEN48462"></a>
<div class="REFSYNOPSISDIV"><a name="AEN48464"></a><h2>语法</h2>
<pre class="SYNOPSIS">CREATE SCHEMA <tt class="REPLACEABLE"><i>schemaname</i></tt> [ AUTHORIZATION <tt class="REPLACEABLE"><i>username</i></tt> ] [ <tt class="REPLACEABLE"><i>schema_element</i></tt> [ ... ] ]
CREATE SCHEMA AUTHORIZATION <tt class="REPLACEABLE"><i>username</i></tt> [ <tt class="REPLACEABLE"><i>schema_element</i></tt> [ ... ] ]</pre>
</div>
<div class="REFSECT1"><a name="AEN48471"></a><h2>描述</h2>
<p><tt class="COMMAND">CREATE SCHEMA</tt> 在当前数据库里输入一个新模式。该模式名将在当前数据库里现存的所有模式名中唯一。</p>
<p>模式实际上是一个名字空间：它包含命名对象(表、数据类型、函数、操作符)这些名字可以和其它模式里存在的其它对象重名。命名对象要么是通过用模式名作为前缀"修饰"进行访问，要么是通过设置一个搜索路径包含所需要的模式。一条带着无修饰对象名的 <tt class="LITERAL">CREATE</tt> 命令都是在当前模式中创建的(在搜索路径最前面的模式；可以用 <code class="FUNCTION">current_schema</code> 函数来判断)。</p>
<p>另外，<tt class="COMMAND">CREATE SCHEMA</tt> 可以包括在新模式中创建对象的子命令。这些子命令和那些在创建完模式后发出的命令没有任何区别，只不过是如果使用了 <tt class="LITERAL">AUTHORIZATION</tt> 子句，那么所有创建的对象都将被该用户拥有。</p>
</div>
<div class="REFSECT1"><a name="AEN48482"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="REPLACEABLE"><i>schemaname</i></tt></dt>
<dd><p>要创建的模式名字。如果省略，则使用用户名作为模式名。这个名字不能以 <tt class="LITERAL">pg_</tt> 开头，因为这样的名字保留给系统模式使用。</p></dd>
<dt><tt class="REPLACEABLE"><i>username</i></tt></dt>
<dd><p>将拥有该模式的用户名。如果省略，缺省为执行该命令的用户名。只有超级用户才能创建不属于自己的模式。</p></dd>
<dt><tt class="REPLACEABLE"><i>schema_element</i></tt></dt>
<dd><p>一个 SQL 语句，定义一个要在模式里创建的对象。目前，只有 <tt class="COMMAND">CREATE TABLE</tt>, <tt class="COMMAND">CREATE VIEW</tt>, <tt class="COMMAND">CREATE INDEX</tt>, <tt class="COMMAND">CREATE SEQUENCE</tt>, <tt class="COMMAND">CREATE TRIGGER</tt>, <tt class="COMMAND">GRANT</tt> 是可以接受的子句。其它类型的对象可以在创建完模式之后的独立命令里创建。</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN48508"></a><h2>注意</h2>
<p>要创建模式，调用该命令的用户必需在当前数据库上有 <tt class="LITERAL">CREATE</tt> 权限。当然，超级用户可以绕开这个检查。</p>
</div>
<div class="REFSECT1"><a name="AEN48512"></a><h2>例子</h2>
<p>创建一个模式：</p>
<pre class="PROGRAMLISTING">CREATE SCHEMA myschema;</pre>
<p>为用户 <tt class="LITERAL">joe</tt> 创建模式，模式名也叫 <tt class="LITERAL">joe</tt> ：</p>
<pre class="PROGRAMLISTING">CREATE SCHEMA AUTHORIZATION joe;</pre>
<p>创建一个模式并且在里面创建一个表：</p>
<pre class="PROGRAMLISTING">CREATE SCHEMA hollywood
    CREATE TABLE films (title text, release date, awards text[])
    CREATE VIEW winners AS
        SELECT title, release FROM films WHERE awards IS NOT NULL;</pre>
<p>请注意上面独立的子命令不是由分号结尾的。</p>
<p>下面的命令是实现同样结果的等效语句：</p>
<pre class="PROGRAMLISTING">CREATE SCHEMA hollywood;
CREATE TABLE hollywood.films (title text, release date, awards text[]);
CREATE VIEW hollywood.winners AS
    SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;</pre>
</div>
<div class="REFSECT1"><a name="AEN48524"></a><h2>兼容性</h2>
<p>SQL 标准允许在 <tt class="COMMAND">CREATE SCHEMA</tt> 里面有一个 <tt class="LITERAL">DEFAULT CHARACTER SET</tt> 子句以及比目前 PostgreSQL 可以接受的更多的子命令。</p>
<p>SQL 标准声明在 <tt class="COMMAND">CREATE SCHEMA</tt> 里的子命令可以以任意顺序出现。目前 PostgreSQL 里的实现还不能处理所有子命令里需要提前引用的情况；有时候可能需要重排一下子命令的顺序以避免前向引用。</p>
<p>在 SQL 标准里，模式的所有者总是拥有其中的所有对象。PostgreSQL 允许模式包含非模式所有者所有的对象。只有在模式所有者 <tt class="LITERAL">CREATE</tt> 了自己的模式的权限给了其他人才可能出现。</p>
</div>
<div class="REFSECT1"><a name="AEN48536"></a><h2>又见</h2><a href="sql-alterschema.html"><i>ALTER SCHEMA</i></a>, <a href="sql-dropschema.html"><i>DROP SCHEMA</i></a></div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-createrule.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-createsequence.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">CREATE RULE</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">CREATE SEQUENCE</td></tr>
</table>
</div>
</body></html>